1. Technical Field
The present invention is directed to an improved apparatus and method for performing traces of program execution. More specifically, the present invention is directed to an apparatus and method for dynamic insertion of hooks into program code in order to trace the execution of the program code with minimal system perturbation.
2. Description of Related Art
In analyzing and enhancing performance of a data processing system and the applications executing within the data processing system, it is helpful to know which software modules within a data processing system are using system resources. Effective management and enhancement of data processing systems requires knowing how and when various system resources are being used. Performance tools are used to monitor and examine a data processing system to determine resource consumption as various software applications are executing within the data processing system. For example, a performance tool may identify the most frequently executed modules and instructions in a data processing system, or may identify those modules which allocate the largest amount of memory or perform the most I/O requests. Hardware performance tools may be built into the system or added at a later point in time.
Software performance tools also are useful in data processing systems, such as personal computer systems, which typically do not contain many, if any, built-in hardware performance tools. One known software performance tool is a trace tool. A trace tool may use more than one technique to provide trace information that indicates execution flows for an executing program.
One technique keeps track of particular sequences of instructions by logging certain events as they occur, so-called event-based profiling technique. For example, a trace tool may log every entry into, and every exit from, a module, subroutine, method, function, or system component. Alternately, a trace tool may log the requester and the amounts of memory allocated for each memory allocation request. Typically, a time-stamped record is produced for each such event. Corresponding pairs of records similar to entry-exit records also are used to trace execution of arbitrary code segments, starting and completing I/O or data transmission, and for many other events of interest.
Event-based profiling tends to perturb the computing system and possibly invalidate results of the trace of the program execution. The perturbation of computing systems is due to the expense in handling too many events. That is, because hooks, which are used to generate events in event-based profiling, must be inserted into the code of the program before the workload of the program is executed, it is not known where the hooks should be placed. That is, since the trace tool or programmer does not know a priori, the path of the workload, all possible paths must be covered by the insertion of hooks. As a result, many more hooks are encountered during the execution and trace of the program than may be necessary to obtaining an understanding of the program execution.
In some cases, hooks in a program under trace may be turned on and off. However, in such cases, either all of the hooks are turned on, or all of the hooks are turned off. As a result, while the workload of the program can run unperturbed when not being traced, when the events are turned on for tracing, the perturbation begins and different performance results may be obtained by the trace than are actually experienced when the hooks are turned off.
In still other cases, certain ones of the hooks in a program under trace may be turned on while others are turned off. For example, only hooks on selected threads may be turned on while all other hooks are turned off. However, with such systems, there is considerable overhead in determining whether a hook is to be executed or not, i.e. whether the hook is turned on or off, that results in performance penalties.
Executing hooks frequently causes a significant amount of perturbation. For example, Java profiling using the Java Virtual Machine Profiler Interface (JVMPI) for method entries and exits tends to slow applications from 2 to 30 times.
One approach to avoiding the overhead of execution of hooks during tracing of a program is to execute fewer hooks. However, in this case, all the possible paths of execution are not hooked and thus, important paths of execution may be missed. That is, if the number of hooks is reduced, so is the information that is obtained during the trace.
Therefore, it would be advantageous to have an apparatus and method for tracing the execution of a program in which the number of hooks executed during the trace is kept to a minimum without losing information regarding important paths of execution of the program. It would further be advantageous to have an apparatus and method for tracing the execution of a program in which hooks are inserted into and removed from the paths of execution of a program dynamically so as to maintain the number of hooks at a minimum level.